package com.kingyea.mobilepolice;

import com.kingyea.esb.jmx.Monitor;
import com.kingyea.esb.shareservice.bigdata.proxyinterface.CrossBoundaryRsProxyQueryServiceImpl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;


/**
 * 注意,启动类  要放在所有需要注入的包的外面或者同级
 * Created by Mr.Lin on 17/10/31.
 */
@EnableFeignClients //用于启动Fegin功能
//@EnableEurekaClient
//@ComponentScan(basePackages = "com")
@SpringBootApplication
@EnableDiscoveryClient  //激活eureka中的DiscoveryClient实现
@EnableTransactionManagement
@EnableScheduling // 激活定时任务
@EnableAsync// 异步调用开启
@EnableConfigurationProperties
//@ConditionalOnClass(value = {HealthIndicator.class, EndpointAutoConfiguration.class})// ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy 异常？
@ImportResource({"classpath:/launcher/etc/platform.xml","classpath:/launcher/etc/modules/resources/resources.xml"})
@Import({CrossBoundaryRsProxyQueryServiceImpl.class,Monitor.class})
public class ApiServiceApplication {

    public static void main(String[] args) throws Exception {
        System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
        System.out.println(ApiServiceApplication.class.getResource("/launcher").getPath());
        String launcherDir = ApiServiceApplication.class.getResource("/launcher").getPath();
        System.setProperty("KingyeaESBHome", launcherDir);
        SpringApplication.run(ApiServiceApplication.class, args);
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        com.kingyea.esb.platform.Main.start();

    }

    /**
     * attention:简单跨域就是GET，HEAD和POST请求，但是POST请求的"Content-Type"只能是application/x-www-form-urlencoded, multipart/form-data 或 text/plain
     * 反之，就是非简单跨域，此跨域有一个预检机制，说直白点，就是会发两次请求，一次OPTIONS请求，一次真正的请求
     */
    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true); // 允许cookies跨域
        config.addAllowedOrigin("*");// #允许向该服务器提交请求的URI，*表示全部允许，在SpringMVC中，如果设成*，会自动转成当前请求头中的Origin
        config.addAllowedHeader("*");// #允许访问的头信息,*表示全部
        config.setMaxAge(18000L);// 预检请求的缓存时间（秒），即在这个时间段里，对于相同的跨域请求不会再预检了
        config.addAllowedMethod("OPTIONS");// 允许提交请求的方法，*表示全部允许
        config.addAllowedMethod("HEAD");
        config.addAllowedMethod("GET");// 允许Get的请求方法
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("DELETE");
        config.addAllowedMethod("PATCH");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}
